import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import numpy as np
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.arima_model import ARMA
import warnings
from statsmodels.tsa.api import ExponentialSmoothing, SimpleExpSmoothing, Holt, SARIMAX
from sklearn.metrics import mean_squared_error
import os
import sklearn
import math
# Current directory of File
directory = os.getcwd()
df_PL = pd.read_excel(r'F:\P&L_forecasting\P_L_Historical_qtr.xlsx', sheet_name='FY17_onwrds') df_BS = pd.read_excel(r'F:\P&L_forecasting\BS_qtr.xlsx', sheet_name='FY17_onwrds') df12 = pd.read_excel(r'F:\P&L_forecasting\P_L_Historical_qtr.xlsx', sheet_name='trnsps_num') df_macro = pd.read_excel(r'F:\P&L_forecasting\Macro_data.xlsx', sheet_name='data')
df_PL = pd.read_excel(str(directory + '\P_L_Historical_qtr.xlsx'), sheet_name='FY17_onwrds')
df_BS = pd.read_excel(str(directory + '\BS_qtr.xlsx'), sheet_name='FY17_onwrds')
#df12 = pd.read_excel(r'F:\P&L_forecasting\P_L_Historical_qtr.xlsx', sheet_name='trnsps_num')
df_macro = pd.read_excel(str(directory + '\Macro_data.xlsx'), sheet_name='data')
#Defining MAPE function
def MAPE(Y_actual,Y_Predicted):
mape = np.mean(np.abs((Y_actual - Y_Predicted)/Y_actual))*100
return mape
def Chart_plot(col_name, fc_series):
plt.figure(figsize=(12,8), dpi=200)
plt.plot(train, label='training',marker = 'o', linestyle= '--')
plt.plot(test, label='actual',marker = 'o', linestyle= '--', color = 'cornflowerblue')
plt.plot(fc_series, label='forecast',marker = 'o', linestyle= ':' , color = 'orange')
mon = ['Jun', "Sep", 'Dec', 'Mar']
#Q= ['Q1','Q2','Q3','Q4']
yrs = list(np.arange(17,23,1))
x_tks = ['FY' + str(j) +'_'+i.strip() for j in yrs for i in mon]
x = np.arange(0, len(train) + len(fc_series), 1)
plt.xticks(x, x_tks, rotation=75)
plt.legend(loc='upper left', fontsize=8)
plt.grid(True)
for x,y in zip(x,df_PL[col_name]):
label = "{:.2f}".format(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
color = 'b',
ha='center') # horizontal alignment can be left, right or center
tst_x = np.arange(18,23, 1)
for x,y in zip(tst_x,fc_series):
label = "{:.2f}".format(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
color = 'darkorange',
ha='right') # horizontal alignment can be left, right or center
print(fc_series)
mape = "{:.3f}".format(MAPE(test, fc_series))
#print('MAPE :: %s' %mape, '%')
plt.title(col_name +'- Forecating'+'----MAPE--'+str(mape)+'%')
#plt.savefig(str(directory +'\\'+ 'Horizon 4 Images'+'\\' +col_name+ '.jpg'))
Predictors = ['Yield on Advances' ,'Gross Advances']
Target = 'Interest on Advances'
# Define Total Count of Data
Tot_cnt = 20
# Define No. of Samples to be used for Training
Tr_cnt = 16
df_mac = df_macro[Predictors]
Forecast_test = pd.DataFrame()
Forecast_test[Predictors[0]]= Macro_forecast_arima(Predictors[0],Tr_cnt,Tot_cnt - Tr_cnt)
Forecast_test[Predictors[1]]= Macro_forecast_arima(Predictors[1],Tr_cnt,Tot_cnt - Tr_cnt)
Forecast_test
col_name = 'Gross Advances'
tr_cnt = 16
train = df_macro[col_name][:tr_cnt]
test = df_macro[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=4)
exp_model = exp.fit(smoothing_level=0.8)
fc_series = exp_model.forecast(4)
# Holt Winters
#fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.25, smoothing_trend=0.1,optimized=False)
#fc_series = fit2.forecast(4)
# Plot
plt.figure(figsize=(12,8), dpi=200)
plt.plot(train, label='training',marker = 'o', linestyle= '--')
plt.plot(test, label='actual',marker = 'o', linestyle= '--', color = 'cornflowerblue')
plt.plot(fc_series, label='forecast',marker = 'o', linestyle= ':' , color = 'limegreen')
mon = ['Jun', "Sep", 'Dec', 'Mar']
#Q= ['Q1','Q2','Q3','Q4']
yrs = list(np.arange(17,23,1))
x_tks = ['FY' + str(j) +'_'+i.strip() for j in yrs for i in mon]
x = np.arange(0, len(train) + len(fc_series), 1)
plt.xticks(x, x_tks, rotation=75)
plt.legend(loc='upper left', fontsize=8)
plt.grid(True)
x_cor = len(train) - 8
y_cor = max(train)- max(train) * 0.005
g = pd.DataFrame()
g['Horizon'] = np.arange(1,len(fc_series)+1, 1)
g['Value'] = pd.Series(fc_series.reset_index(drop = True))
g = g.round(2)
plt.text(x_cor,y_cor, 'FORECAST :- \n %s ' %g.to_string(index = False), bbox = dict(facecolor = 'grey', alpha = 0.1))
for x,y in zip(x,df_macro[col_name]):
label = round(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
ha='center') # horizontal alignment can be left, right or center
print(fc_series)
mape = "{:.3f}".format(MAPE(test, fc_series))
print('MAPE :: %s' %mape, '%')
plt.title(col_name +'- Forecating'+'----MAPE--'+str(mape)+'%')
plt.savefig(str(directory +'\\'+ 'Horizon 4 Images'+'\\' +col_name+ '.jpg'))
GA = fc_series
GA
col_name = 'Yield on Advances'
tr_cnt = 16
train = df_macro[col_name][:tr_cnt]
test = df_macro[col_name][tr_cnt:]
# Exponential Smoothing
#exp = ExponentialSmoothing(train, trend='ADD', seasonal='ADD', seasonal_periods=4)
#exp_model = exp.fit(smoothing_level=0.8)
#fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=False, initialization_method="heuristic").fit(smoothing_level=0.25, smoothing_trend=0.1,optimized=False)
fc_series = fit2.forecast(4)
# Plot
plt.figure(figsize=(12,8), dpi=200)
plt.plot(train, label='training',marker = 'o', linestyle= '--')
plt.plot(test, label='actual',marker = 'o', linestyle= '--', color = 'cornflowerblue')
plt.plot(fc_series, label='forecast',marker = 'o', linestyle= ':' , color = 'limegreen')
plt.title(col_name +'- Forecating')
mon = ['Jun', "Sep", 'Dec', 'Mar']
#Q= ['Q1','Q2','Q3','Q4']
yrs = list(np.arange(17,23,1))
x_tks = ['FY' + str(j) +'_'+i.strip() for j in yrs for i in mon]
x = np.arange(0, len(train) + len(fc_series), 1)
plt.xticks(x, x_tks, rotation=75)
plt.legend(loc='upper right', fontsize=8)
plt.grid(True)
x_cor = len(train) - 8
y_cor = max(train)- max(train) * 0.05
g = pd.DataFrame()
g['Horizon'] = np.arange(1,len(fc_series)+1, 1)
g['Value'] = pd.Series(fc_series.reset_index(drop = True))
g = g.round(2)
plt.text(x_cor,y_cor, 'FORECAST :- \n %s ' %g.to_string(index = False), bbox = dict(facecolor = 'grey', alpha = 0.1))
for x,y in zip(x,df_macro[col_name]):
label = "{:.2f}".format(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
ha='center') # horizontal alignment can be left, right or center
plt.savefig(str(directory +'\\'+ 'Horizon 4 Images'+'\\' +col_name+ '.jpg'))
print('MAPE :: %s' %"{:.3f}".format(MAPE(test, fc_series)), '%')
YOA = fc_series
YOA
col_name = 'Gross NPAs'
train = df_macro[col_name][:18]
test = df_macro[col_name][18:]
# evaluate parameters
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
ordr = evaluate_models(df_macro[col_name], p_values, d_values, q_values)
model = ARIMA(train, order=ordr)
model_fit = model.fit()
result = model_fit.get_forecast(steps=2)
output = result.summary_frame(alpha = 0.05)
print(output['mean'])
fc_series = pd.Series(output['mean'])
lower_series = pd.Series(output['mean_ci_lower'])
upper_series = pd.Series(output['mean_ci_upper'])
# Plot
plt.figure(figsize=(12,8), dpi=200)
plt.plot(train, label='training',marker = 'o', linestyle= '--')
plt.plot(test, label='actual',marker = 'o', linestyle= '--', color = 'cornflowerblue')
plt.plot(fc_series, label='forecast',marker = 'o', linestyle= ':' , color = 'limegreen')
plt.fill_between(lower_series.index, lower_series, upper_series,
color='k', alpha=.15)
plt.title(col_name +'- Forecating')
mon = ['Jun', "Sep", 'Dec', 'Mar']
#Q= ['Q1','Q2','Q3','Q4']
yrs = list(np.arange(17,23,1))
x_tks = ['FY' + str(j) +'_'+i.strip() for j in yrs for i in mon]
x = np.arange(0, len(train) + len(fc_series), 1)
plt.xticks(x, x_tks, rotation=75)
plt.legend(loc='upper left', fontsize=8)
plt.grid(True)
x_cor = len(train) - 5
y_cor = max(train)- max(train) * 0.05
g = pd.DataFrame()
g['Horizon'] = np.arange(1,len(fc_series)+1, 1)
g['Value'] = pd.Series(fc_series.reset_index(drop = True))
g = g.round(2)
plt.text(x_cor,y_cor, 'FORECAST :- \n %s ' %g.to_string(index = False), bbox = dict(facecolor = 'grey', alpha = 0.1))
for x,y in zip(x,df_macro[col_name]):
label = "{:.2f}".format(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
ha='center') # horizontal alignment can be left, right or center
plt.savefig(str(directory +'\\'+ col_name + '_2.jpg'))
#G_NPA = fc_series
# grid search ARIMA parameters for time series
# evaluate an ARIMA model for a given order (p,d,q)
def evaluate_sarimax_model(X, arima_order, seasonal_order,train_size,frcst_stp):
# prepare training dataset
#train_size = 16 #int(len(X) * 0.66)
train, test = X[0:train_size], X[train_size:]
history = [x for x in train]
# make predictions
predictions = list()
for t in range(len(test)):
model = SARIMAX(history, order=arima_order, seasonal_order=seasonal_order)
model_fit = model.fit()
yhat = model_fit.forecast(steps = frcst_stp)[0]
predictions.append(yhat)
# calculate out of sample error
mape_ = MAPE(test, predictions)
return mape_
# evaluate combinations of p, d and q values for an ARIMA model
def evaluate_ssnl_models(dataset, p_values, d_values, q_values, P_values, D_values, Q_values,tr_cnt,frcst_stp):
dataset = dataset.astype('float32')
best_score, best_cfg = float("inf"), None
for p in p_values:
for d in d_values:
for q in q_values:
for P in P_values:
for D in D_values:
for Q in Q_values:
#print(p,d,q)
order = (p,d,q)
seasonal_order = (P,D,Q,4)
try:
mape = evaluate_sarimax_model(dataset, order, seasonal_order,tr_cnt,frcst_stp)
if mape < best_score:
best_score, best_cfg, best_s_cfg = mape, order, seasonal_order
#print('SARIMAX%s MAPE=%.3f' % (order,mape))
except:
continue
print('Best ARIMA%s Seasonal%s MAPE=%.3f' % (best_cfg, best_s_cfg, best_score))
return best_cfg, best_s_cfg
def Macro_forecast_sarimax(col_name,tr_cnt,frcst_cnt):
# evaluate parameters
p_values = [0, 1]
d_values = [0,1]
q_values = [0,1]
P_values = [0, 1]
D_values = [0, 1]
Q_values = [0, 1]
warnings.filterwarnings("ignore")
ordr, s_ordr = evaluate_ssnl_models(df_macro[col_name], p_values, d_values, q_values, P_values, D_values, Q_values, tr_cnt)
train = df_macro[col_name][:tr_cnt]
test = df_macro[col_name][tr_cnt:]
best_order = ordr
best_seasonal_order = s_ordr
# define model
model = SARIMAX(train, order=best_order, seasonal_order=best_seasonal_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=frcst_cnt)
output = result.summary_frame(alpha = 0.05)
print(output['mean'])
fc_series = pd.Series(output['mean'])
lower_series = pd.Series(output['mean_ci_lower'])
upper_series = pd.Series(output['mean_ci_upper'])
# Plot
plt.figure(figsize=(12,8), dpi=200)
plt.plot(train, label='training',marker = 'o', linestyle= '--')
plt.plot(test, label='actual',marker = 'o', linestyle= '--', color = 'cornflowerblue')
plt.plot(fc_series, label='forecast',marker = 'o', linestyle= ':' , color = 'limegreen')
plt.fill_between(lower_series.index, lower_series, upper_series,
color='k', alpha=.15)
plt.title(col_name +'- Forecating')
mon = ['Jun', "Sep", 'Dec', 'Mar']
#Q= ['Q1','Q2','Q3','Q4']
yrs = list(np.arange(17,23,1))
x_tks = ['FY' + str(j) +'_'+i.strip() for j in yrs for i in mon]
x = np.arange(0, len(train) + len(fc_series), 1)
plt.xticks(x, x_tks, rotation=75)
plt.legend(loc='upper left', fontsize=8)
plt.grid(True)
x_cor = len(train) - 5
y_cor = max(train)- max(train) * 0.05
g = pd.DataFrame()
g['Horizon'] = np.arange(1,len(fc_series)+1, 1)
g['Value'] = pd.Series(fc_series.reset_index(drop = True))
g = g.round(2)
plt.text(x_cor,y_cor, 'FORECAST :- \n %s ' %g.to_string(index = False), bbox = dict(facecolor = 'grey', alpha = 0.1))
for x,y in zip(x,df_macro[col_name]):
label = "{:.2f}".format(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
ha='center') # horizontal alignment can be left, right or center
#plt.savefig('C:/Users/1015136/Downloads/P&L_forecasting/P&L_forecasting/Horizon 2 Images/'+col_name + '.jpg')
plt.savefig(str(directory +'\\'+ 'Horizon 4 Images'+'\\' +col_name +'_ssnl'+ '.jpg'))
return fc_series
# grid search ARIMA parameters for time series
# evaluate an ARIMA model for a given order (p,d,q)
def evaluate_arima_model(X, arima_order,train_size,frcst_stp):
# prepare training dataset
#train_size = 18 #int(len(X) * 0.66)
train, test = X[0:train_size], X[train_size:]
history = [x for x in train]
# make predictions
predictions = list()
for t in range(len(test)):
#print(t)
model = ARIMA(history, order=arima_order)
model_fit = model.fit()
yhat = model_fit.forecast(steps = frcst_stp)[0]
predictions.append(yhat)
# calculate out of sample error
mape_ = MAPE(test, predictions)
return mape_
# evaluate combinations of p, d and q values for an ARIMA model
def evaluate_models(dataset, p_values, d_values, q_values,train_size,frcst_stp):
dataset = dataset.astype('float32')
best_score, best_cfg = float("inf"), None
for p in p_values:
for d in d_values:
for q in q_values:
order = (p,d,q)
try:
mape = evaluate_arima_model(dataset, order,train_size,frcst_stp)
if mape < best_score:
best_score, best_cfg = mape, order
#print('ARIMA%s MAPE=%.3f' % (order,mape))
except:
continue
print('Best ARIMA%s MAPE=%.3f' % (best_cfg, best_score))
return best_cfg
def Macro_forecast_arima(col_name,tr_cnt,frcst_cnt):
# evaluate parameters
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_macro[col_name], p_values, d_values, q_values,tr_cnt,frcst_cnt)
train = df_macro[col_name][:tr_cnt]
test = df_macro[col_name][tr_cnt:]
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=frcst_cnt)
output = result.summary_frame(alpha = 0.05)
#print(output['mean'])
fc_series = pd.Series(output['mean'])
lower_series = pd.Series(output['mean_ci_lower'])
upper_series = pd.Series(output['mean_ci_upper'])
# Plot
plt.figure(figsize=(12,8), dpi=200)
plt.plot(train, label='training',marker = 'o', linestyle= '--')
plt.plot(test, label='actual',marker = 'o', linestyle= '--', color = 'cornflowerblue')
plt.plot(fc_series, label='forecast',marker = 'o', linestyle= ':' , color = 'limegreen')
plt.fill_between(lower_series.index, lower_series, upper_series,
color='k', alpha=.15)
plt.title(col_name +'- Forecating')
mon = ['Jun', "Sep", 'Dec', 'Mar']
#Q= ['Q1','Q2','Q3','Q4']
yrs = list(np.arange(17,23,1))
x_tks = ['FY' + str(j) +'_'+i.strip() for j in yrs for i in mon]
x = np.arange(0, len(train) + len(fc_series), 1)
plt.xticks(x, x_tks, rotation=75)
plt.legend(loc='upper left', fontsize=8)
plt.grid(True)
x_cor = len(train) - 5
y_cor = max(train)- max(train) * 0.05
g = pd.DataFrame()
g['Horizon'] = np.arange(1,len(fc_series)+1, 1)
g['Value'] = pd.Series(fc_series.reset_index(drop = True))
g = g.round(2)
plt.text(x_cor,y_cor, 'FORECAST :- \n %s ' %g.to_string(index = False), bbox = dict(facecolor = 'grey', alpha = 0.1))
for x,y in zip(x,df_macro[col_name]):
label = "{:.2f}".format(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
ha='center') # horizontal alignment can be left, right or center
#plt.savefig(str(directory +'\\'+ 'Horizon 4 Images'+'\\' +col_name+ '_non_ssnl' + '.jpg'))
return fc_series
def ML_REG_ALGOS(reg_train_x, reg_train_y, reg_test_x, reg_test_y):
results = pd.DataFrame()
rmse = ['RMSE']
results['Actual'] = reg_test_y
from sklearn.linear_model import LinearRegression
reg = LinearRegression().fit(reg_train_x, reg_train_y)
pred = reg.predict(reg_test_x)
results['LR o/p'] = pred
rmse.append(mean_squared_error(reg_test_y, pred,squared=False))
#mse = sklearn.metrics.mean_squared_error(reg_test_y, pred)
#rmse = math.sqrt(mse)
#print(rmse)
'''
# Feature Importance
imp = reg.coef_
f_imp = pd.DataFrame({'feature': list(reg_train_x), 'Feature_imp' : [abs(v) for i,v in enumerate(imp)]})
print(f_imp)
'''
from sklearn import tree
reg = tree.DecisionTreeRegressor()
reg.fit(reg_train_x, reg_train_y)
pred = reg.predict(reg_test_x)
results['DT o/p'] = pred
rmse.append(mean_squared_error(reg_test_y, pred,squared=False))
from sklearn.ensemble import RandomForestRegressor
reg = RandomForestRegressor()
reg.fit(reg_train_x, reg_train_y)
pred = reg.predict(reg_test_x)
results['RF o/p'] = pred
rmse.append(mean_squared_error(reg_test_y, pred,squared=False))
from xgboost import XGBRegressor
reg = XGBRegressor(eta= 0.1, tree_method = 'approx')
reg.fit(reg_train_x, reg_train_y)
pred = reg.predict(reg_test_x)
results['XGB o/p'] = pred
rmse.append(mean_squared_error(reg_test_y, pred,squared=False))
from sklearn.svm import SVR
reg = SVR()
reg.fit(reg_train_x, reg_train_y)
pred = reg.predict(reg_test_x)
results['SVM o/p'] = pred
rmse.append(mean_squared_error(reg_test_y, pred,squared=False))
results.loc[len(results.index)] = rmse
print(results)
Predictors = ['Yield on Advances' ,'Gross Advances']
Target = 'Interest on Advances'
#Predictors = ['Cost of Deposits ' ,'Deposits ']
#Target = 'Interest on Deposits'
#Predictors = ['Yield on Investments' ,'Investments']
#Target = 'Int on Resources Operations'
# Define Total Count of Data
Tot_cnt = 20
# Define No. of Samples to be used for Training
Tr_cnt = 16
df_mac = df_macro[Predictors]
Forecast_test = pd.DataFrame()
Forecast_test[Predictors[0]]= Macro_forecast_sarimax(Predictors[0],Tr_cnt,Tot_cnt - Tr_cnt)
Forecast_test[Predictors[1]]= Macro_forecast_sarimax(Predictors[1],Tr_cnt,Tot_cnt - Tr_cnt)
Forecast_test
# Results from individual modeling
Predictors = ['Yield on Advances' ,'Gross Advances']
Target = 'Interest on Advances'
training_cnt = 16
Forecast_test = pd.DataFrame()
Forecast_test[Predictors[0]]= YOA
Forecast_test[Predictors[1]]= GA
reg_train_x = df_macro[Predictors][:training_cnt]
reg_test_x = df_macro[Predictors][training_cnt:]
reg_test_x = Forecast_test
#print(reg_test_x)
reg_train_y = df_PL[:20][Target][:training_cnt]
reg_test_y = df_PL[:20][Target][training_cnt:]
ML_REG_ALGOS(reg_train_x, reg_train_y, reg_test_x, reg_test_y)
# Results from individual modeling
Predictors = ['Yield on Advances' ,'Gross Advances']
Target = 'Interest on Advances'
from sklearn.preprocessing import MinMaxScaler
df_macro = pd.read_excel(str(directory + '\Macro_data.xlsx'), sheet_name='data')
training_cnt = 16
Forecast_test = pd.DataFrame()
Forecast_test[Predictors[0]]= YOA
Forecast_test[Predictors[1]]= GA/1e5
#df_macro['Gross Advances'] = df_macro['Gross Advances']/1e6
trans = MinMaxScaler()
df_macro[Predictors] = trans.fit_transform(df_macro[Predictors])
reg_train_x = df_macro[Predictors][:training_cnt]
reg_test_x = df_macro[Predictors][training_cnt:]
print(reg_train_x.head())
#reg_test_x = Forecast_test
print(reg_test_x)
reg_train_y = df_PL[:20][Target][:training_cnt]
reg_test_y = df_PL[:20][Target][training_cnt:]
#ML_REG_ALGOS(reg_train_x, reg_train_y, reg_test_x, reg_test_y)
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from xgboost import XGBRegressor
from sklearn.svm import SVR
reg = SVR()
#reg = XGBRegressor(eta= 0.1, tree_method = 'approx')
reg.fit(reg_train_x, reg_train_y)
#reg = LinearRegression().fit(reg_train_x, reg_train_y)
pred = reg.predict(reg_test_x)
SS_Residual = sum((reg_test_y-pred)**2)
SS_Total = sum((reg_test_y-np.mean(reg_test_y))**2)
r_squared = 1 - (SS_Residual)/SS_Total
adjusted_r_squared = 1 - (1-r_squared)*(len(reg_test_y)-1)/(len(reg_test_y)-reg_train_x.shape[1]-1)
print ('R-Squared %s' %r_squared, 'Adjusted R-Squared %s' %adjusted_r_squared)
list(reg_train_x)
col_name = 'Interest on Advances'
tr_cnt = 16
train = df_PL[col_name][:20][:tr_cnt]
test = df_PL[col_name][:20][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='ADD')
exp_model = exp.fit(smoothing_level=0.8)
fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=False, initialization_method="estimated").fit(smoothing_level=0.5, smoothing_trend=0.05,optimized=False)
#fc_series = fit2.forecast(4)
# Plot
plt.figure(figsize=(12,8), dpi=200)
plt.plot(train, label='training',marker = 'o', linestyle= '--')
plt.plot(test, label='actual',marker = 'o', linestyle= '--', color = 'cornflowerblue')
plt.plot(fc_series, label='forecast',marker = 'o', linestyle= ':' , color = 'limegreen')
plt.title(col_name +'- Forecating')
mon = ['Jun', "Sep", 'Dec', 'Mar']
#Q= ['Q1','Q2','Q3','Q4']
yrs = list(np.arange(17,23,1))
x_tks = ['FY' + str(j) +'_'+i.strip() for j in yrs for i in mon]
x = np.arange(0, len(train) + len(fc_series), 1)
plt.xticks(x, x_tks, rotation=75)
plt.legend(loc='upper right', fontsize=8)
plt.grid(True)
x_cor = len(train) - 8
y_cor = max(train)- max(train) * 0.05
g = pd.DataFrame()
g['Horizon'] = np.arange(1,len(fc_series)+1, 1)
g['Value'] = pd.Series(fc_series.reset_index(drop = True))
g = g.round(2)
plt.text(x_cor,y_cor, 'FORECAST :- \n %s ' %g.to_string(index = False), bbox = dict(facecolor = 'grey', alpha = 0.1))
for x,y in zip(x,df_PL[col_name]):
label = "{:.2f}".format(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
ha='center') # horizontal alignment can be left, right or center
#plt.savefig(str(directory +'\\'+ 'Horizon 4 Images'+'\\' +col_name+ '.jpg'))
print('MAPE :: %s' %MAPE(test, fc_series))
print('RMSE :: %s' %mean_squared_error(test, fc_series,squared=False))
YOA = fc_series
YOA
col_name = 'Cost of Deposits '
tr_cnt = 16
train = df_macro[col_name][:tr_cnt]
test = df_macro[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=4)
exp_model = exp.fit(smoothing_level=0.8)
#fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.01, smoothing_trend=0.05,optimized=False)
fc_series = fit2.forecast(4)
# Plot
plt.figure(figsize=(12,8), dpi=200)
plt.plot(train, label='training',marker = 'o', linestyle= '--')
plt.plot(test, label='actual',marker = 'o', linestyle= '--', color = 'cornflowerblue')
plt.plot(fc_series, label='forecast',marker = 'o', linestyle= ':' , color = 'limegreen')
plt.title(col_name +'- Forecating')
mon = ['Jun', "Sep", 'Dec', 'Mar']
#Q= ['Q1','Q2','Q3','Q4']
yrs = list(np.arange(17,23,1))
x_tks = ['FY' + str(j) +'_'+i.strip() for j in yrs for i in mon]
x = np.arange(0, len(train) + len(fc_series), 1)
plt.xticks(x, x_tks, rotation=75)
plt.legend(loc='upper left', fontsize=8)
plt.grid(True)
x_cor = len(train) - 7
y_cor = max(train)- max(train) * 0.1
g = pd.DataFrame()
g['Horizon'] = np.arange(1,len(fc_series)+1, 1)
g['Value'] = pd.Series(fc_series.reset_index(drop = True))
g = g.round(2)
plt.text(x_cor,y_cor, 'FORECAST :- \n %s ' %g.to_string(index = False), bbox = dict(facecolor = 'grey', alpha = 0.1))
for x,y in zip(x,df_macro[col_name]):
label = "{:.2f}".format(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
ha='center') # horizontal alignment can be left, right or center
plt.savefig(str(directory +'\\'+ 'Horizon 4 Images'+'\\' +col_name+ '.jpg'))
print('MAPE :: %s' %"{:.3f}".format(MAPE(test, fc_series)), '%')
COD = fc_series
COD
col_name = 'Deposits '
tr_cnt = 16
train = df_macro[col_name][:tr_cnt]
test = df_macro[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='mul', seasonal='add', seasonal_periods=4)
#exp = ExponentialSmoothing(train, trend='mul')
exp_model = exp.fit(smoothing_level=0.9)
fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.5, smoothing_trend=0.5,optimized=False)
fc_series = fit2.forecast(4)
# Plot
plt.figure(figsize=(12,8), dpi=200)
plt.plot(train, label='training',marker = 'o', linestyle= '--')
plt.plot(test, label='actual',marker = 'o', linestyle= '--', color = 'cornflowerblue')
plt.plot(fc_series, label='forecast',marker = 'o', linestyle= ':' , color = 'limegreen')
plt.title(col_name +'- Forecating')
mon = ['Jun', "Sep", 'Dec', 'Mar']
#Q= ['Q1','Q2','Q3','Q4']
yrs = list(np.arange(17,23,1))
x_tks = ['FY' + str(j) +'_'+i.strip() for j in yrs for i in mon]
x = np.arange(0, len(train) + len(fc_series), 1)
plt.xticks(x, x_tks, rotation=75)
plt.legend(loc='upper left', fontsize=8)
plt.grid(True)
x_cor = len(train) - 2
y_cor = max(train)- max(train) * 0.2
g = pd.DataFrame()
g['Horizon'] = np.arange(1,len(fc_series)+1, 1)
g['Value'] = pd.Series(fc_series.reset_index(drop = True))
g = g.round(2)
plt.text(x_cor,y_cor, 'FORECAST :- \n %s ' %g.to_string(index = False), bbox = dict(facecolor = 'grey', alpha = 0.1))
for x,y in zip(x,df_macro[col_name]):
label = "{:.2f}".format(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
ha='center') # horizontal alignment can be left, right or center
plt.savefig(str(directory +'\\'+ 'Horizon 4 Images'+'\\' +col_name+ '.jpg'))
print('MAPE :: %s' %"{:.3f}".format(MAPE(test, fc_series)), '%')
DEPO = fc_series
DEPO
# Results from individual modeling
Predictors = ['Cost of Deposits ' ,'Deposits ']
Target = 'Interest on Deposits'
training_cnt = 16
Forecast_test = pd.DataFrame()
Forecast_test[Predictors[0]]= COD
Forecast_test[Predictors[1]]= DEPO
reg_train_x = df_macro[Predictors][:training_cnt]
reg_test_x = df_macro[Predictors][training_cnt:]
reg_test_x = Forecast_test
#print(reg_test_x)
reg_train_y = df_PL[:20][Target][:training_cnt]
reg_test_y = df_PL[:20][Target][training_cnt:]
ML_REG_ALGOS(reg_train_x, reg_train_y, reg_test_x, reg_test_y)
col_name = 'Yield on Investments'
tr_cnt = 16
train = df_macro[col_name][:tr_cnt]
test = df_macro[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='mul', seasonal='mul', seasonal_periods=4)
#exp = ExponentialSmoothing(train, trend='mul')
exp_model = exp.fit(smoothing_level=0.9)
fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.1, smoothing_trend=0.1,optimized=False)
fc_series = fit2.forecast(4)
'''
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_macro[col_name], p_values, d_values, q_values,tr_cnt,4)
train = df_macro[col_name][:tr_cnt]
test = df_macro[col_name][tr_cnt:]
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
'''
# Plot
plt.figure(figsize=(12,8), dpi=200)
plt.plot(train, label='training',marker = 'o', linestyle= '--')
plt.plot(test, label='actual',marker = 'o', linestyle= '--', color = 'cornflowerblue')
plt.plot(fc_series, label='forecast',marker = 'o', linestyle= ':' , color = 'limegreen')
plt.title(col_name +'- Forecating')
mon = ['Jun', "Sep", 'Dec', 'Mar']
#Q= ['Q1','Q2','Q3','Q4']
yrs = list(np.arange(17,23,1))
x_tks = ['FY' + str(j) +'_'+i.strip() for j in yrs for i in mon]
x = np.arange(0, len(train) + len(fc_series), 1)
plt.xticks(x, x_tks, rotation=75)
plt.legend(loc='upper left', fontsize=8)
plt.grid(True)
x_cor = len(train) - 7
y_cor = max(train)- max(train) * 0.1
g = pd.DataFrame()
g['Horizon'] = np.arange(1,len(fc_series)+1, 1)
g['Value'] = pd.Series(fc_series.reset_index(drop = True))
g = g.round(2)
#plt.text(x_cor,y_cor, 'FORECAST :- \n %s ' %g.to_string(index = False), bbox = dict(facecolor = 'grey', alpha = 0.1))
for x,y in zip(x,df_macro[col_name]):
label = "{:.2f}".format(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
ha='center') # horizontal alignment can be left, right or center
tst_x = np.arange(16,21, 1)
for x,y in zip(tst_x,fc_series):
label = "{:.2f}".format(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
color = 'g',
ha='right') # horizontal alignment can be left, right or center
plt.savefig(str(directory +'\\'+ 'Horizon 4 Images'+'\\' +col_name+ '.jpg'))
print('MAPE :: %s' %"{:.3f}".format(MAPE(test, fc_series)), '%')
YOI = fc_series
YOI
col_name = 'Investments'
tr_cnt = 16
train = df_macro[col_name][:tr_cnt]
test = df_macro[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='mul', seasonal='mul', seasonal_periods=4)
#exp = ExponentialSmoothing(train, trend='mul')
exp_model = exp.fit(smoothing_level=0.9)
fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.5, smoothing_trend=0.1,optimized=False)
#fc_series = fit2.forecast(4)
# Plot
plt.figure(figsize=(12,8), dpi=200)
plt.plot(train, label='training',marker = 'o', linestyle= '--')
plt.plot(test, label='actual',marker = 'o', linestyle= '--', color = 'cornflowerblue')
plt.plot(fc_series, label='forecast',marker = 'o', linestyle= ':' , color = 'limegreen')
plt.title(col_name +'- Forecating')
mon = ['Jun', "Sep", 'Dec', 'Mar']
#Q= ['Q1','Q2','Q3','Q4']
yrs = list(np.arange(17,23,1))
x_tks = ['FY' + str(j) +'_'+i.strip() for j in yrs for i in mon]
x = np.arange(0, len(train) + len(fc_series), 1)
plt.xticks(x, x_tks, rotation=75)
plt.legend(loc='upper left', fontsize=8)
plt.grid(True)
x_cor = len(train) - 7
y_cor = max(train)- max(train) * 0.1
g = pd.DataFrame()
g['Horizon'] = np.arange(1,len(fc_series)+1, 1)
g['Value'] = pd.Series(fc_series.reset_index(drop = True))
g = g.round(2)
plt.text(x_cor,y_cor, 'FORECAST :- \n %s ' %g.to_string(index = False), bbox = dict(facecolor = 'grey', alpha = 0.1))
for x,y in zip(x,df_macro[col_name]):
label = "{:.2f}".format(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
ha='center') # horizontal alignment can be left, right or center
tst_x = np.arange(16,21, 1)
for x,y in zip(tst_x,fc_series):
label = "{:.2f}".format(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
color = 'g',
ha='right') # horizontal alignment can be left, right or center
plt.savefig(str(directory +'\\'+ 'Horizon 4 Images'+'\\' +col_name+ '.jpg'))
print('MAPE :: %s' %"{:.3f}".format(MAPE(test, fc_series)), '%')
YOI = fc_series
YOI
col_name = 'Interest on Advances'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_PL[col_name], p_values, d_values, q_values,tr_cnt,4)
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
Chart_plot(col_name,fc_series)
col_name = 'Int on Resources Operations'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_PL[col_name], p_values, d_values, q_values,tr_cnt,4)
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
Chart_plot(col_name,fc_series)
col_name = 'Others Sundry Interest income'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=4)
exp_model = exp.fit(smoothing_level=0.6)
fc_series = exp_model.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Total Interest Income'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_PL[col_name], p_values, d_values, q_values,tr_cnt,4)
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
Chart_plot(col_name,fc_series)
col_name = 'Interest on Deposits'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_PL[col_name], p_values, d_values, q_values,tr_cnt,4)
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
Chart_plot(col_name,fc_series)
col_name = 'Interest on Borrowings'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=4)
exp_model = exp.fit(smoothing_level=0.75)
fc_series = exp_model.forecast(4)
'''
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_PL[col_name], p_values, d_values, q_values,tr_cnt,4)
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
'''
Chart_plot(col_name,fc_series)
col_name = 'Others Sundry Interest paid'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=2)
exp_model = exp.fit(smoothing_level=0.4)
fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.5, smoothing_trend=0.1,optimized=False)
#fc_series = fit2.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Total Interest Expenses'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_PL[col_name], p_values, d_values, q_values,tr_cnt,4)
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
Chart_plot(col_name,fc_series)
col_name = 'Net Interest Income'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='mul', seasonal='add', seasonal_periods=4)
exp_model = exp.fit(smoothing_level=0.01)
fc_series = exp_model.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Commission, Exc. Brokerage'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=4)
exp_model = exp.fit(smoothing_level=0.01)
fc_series = exp_model.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Profit on Sale_or_Rev of Investments'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=4)
exp_model = exp.fit(smoothing_level=0.001)
fc_series = exp_model.forecast(4)
# Holt Winters
#fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.5, smoothing_trend=0.1,optimized=False)
#fc_series = fit2.forecast(4)
p_values = [0, 1]
d_values = range(0,2)
q_values = range(0, 3)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_PL[col_name], p_values, d_values, q_values,tr_cnt,4)
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
Chart_plot(col_name,fc_series)
col_name = 'Forex Income'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='mul', seasonal='mul', seasonal_periods=4)
exp_model = exp.fit(smoothing_level=0.3)
fc_series = exp_model.forecast(4)
# Holt Winters
#fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.5, smoothing_trend=0.1,optimized=False)
#fc_series = fit2.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Dividend'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='mul', seasonal='mul', seasonal_periods=4)
exp_model = exp.fit(smoothing_level=0.3)
fc_series = exp_model.forecast(4)
# Holt Winters
#fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.5, smoothing_trend=0.1,optimized=False)
#fc_series = fit2.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Sundry Other Income'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='mul', seasonal='add', seasonal_periods=4)
exp_model = exp.fit(smoothing_level=0.3)
fc_series = exp_model.forecast(4)
# Holt Winters
#fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.5, smoothing_trend=0.1,optimized=False)
#fc_series = fit2.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Total Non-Interest Income'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=2)
exp_model = exp.fit(smoothing_level=0.4)
fc_series = exp_model.forecast(4)
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_PL[col_name], p_values, d_values, q_values,tr_cnt,4)
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
p_values = [0, 1]
d_values = [0,1]
q_values = [0,1]
P_values = [0, 1]
D_values = [0, 1]
Q_values = [0, 1]
warnings.filterwarnings("ignore")
best_order, best_seasonal_order = evaluate_ssnl_models(df_PL[col_name], p_values, d_values, q_values, P_values, D_values, Q_values,16,4)
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# define model
model = SARIMAX(train, order=best_order, seasonal_order=best_seasonal_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
#fc_series = pd.Series(output['mean'])
Chart_plot(col_name,fc_series)
col_name = 'Total Operating Income'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods=4)
exp_model = exp.fit(smoothing_level=0.6)
fc_series = exp_model.forecast(4)
# Holt Winters
#fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.5, smoothing_trend=0.1,optimized=False)
#fc_series = fit2.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Payment to Employees'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='mul')
exp_model = exp.fit(smoothing_level=0.3)
#fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.1, smoothing_trend=0.4,optimized=False)
fc_series = fit2.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Provisions for Employees'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
'''
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='mul', seasonal='mul', seasonal_periods = 4)
exp_model = exp.fit(smoothing_level=0.3)
fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.1, smoothing_trend=0.4,optimized=False)
#fc_series = fit2.forecast(4)
'''
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_PL[col_name], p_values, d_values, q_values,tr_cnt,4)
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
Chart_plot(col_name,fc_series)
col_name = 'Total Staff Expenses'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='ADD', seasonal='MUL', seasonal_periods = 4)
exp_model = exp.fit(smoothing_level=0.15)
fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.1, smoothing_trend=0.4,optimized=False)
#fc_series = fit2.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Rent_Taxes_Lighting'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='ADD', seasonal='MUL', seasonal_periods = 4)
exp_model = exp.fit(smoothing_level=0.3)
fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.1, smoothing_trend=0.4,optimized=False)
#fc_series = fit2.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Depreciation on Property'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='add')
exp_model = exp.fit(smoothing_level=0.9)
#fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.5, smoothing_trend=0.4,optimized=False)
fc_series = fit2.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Others'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='mul', seasonal='mul', seasonal_periods = 4)
exp_model = exp.fit(smoothing_level=0.85)
fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.1, smoothing_trend=0.4,optimized=False)
#fc_series = fit2.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Total Overhead Expenses'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='mul', seasonal='mul', seasonal_periods = 4)
exp_model = exp.fit(smoothing_level=1.1)
fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.1, smoothing_trend=0.4,optimized=False)
#fc_series = fit2.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Total Operating Expenses'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='mul', seasonal='mul', seasonal_periods = 4)
exp_model = exp.fit(smoothing_level=0.3)
fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.1, smoothing_trend=0.4,optimized=False)
#fc_series = fit2.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Operating Profit'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods = 4)
exp_model = exp.fit(smoothing_level=0.9)
#fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.1, smoothing_trend=0.4,optimized=False)
fc_series = fit2.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Income Tax Provisions'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
warnings.filterwarnings("ignore")
model = ARIMA(train, order=(1,2,0))
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
Chart_plot(col_name,fc_series)
col_name = 'Loan Loss Provisions'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='mul', seasonal='mul', seasonal_periods = 4)
exp_model = exp.fit(smoothing_level=1)
fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.1, smoothing_trend=0.4,optimized=False)
#fc_series = fit2.forecast(4)
Chart_plot(col_name,fc_series)
col_name = 'Investment Depreciation'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_PL[col_name], p_values, d_values, q_values,tr_cnt,4)
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
Chart_plot(col_name,fc_series)
col_name = 'Standard Assets Provision'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_PL[col_name], p_values, d_values, q_values,tr_cnt,4)
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
Chart_plot(col_name,fc_series)
col_name = 'Other Provisions'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_PL[col_name], p_values, d_values, q_values,tr_cnt,4)
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
Chart_plot(col_name,fc_series)
col_name = 'Total Provisions'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
'''
# Exponential Smoothing
exp = ExponentialSmoothing(train, trend='add', seasonal='add', seasonal_periods = 4)
exp_model = exp.fit(smoothing_level=0.3)
fc_series = exp_model.forecast(4)
# Holt Winters
fit2 = Holt(train, exponential=True, initialization_method="estimated").fit(smoothing_level=0.1, smoothing_trend=0.4,optimized=False)
#fc_series = fit2.forecast(4)
'''
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_PL[col_name], p_values, d_values, q_values,tr_cnt,4)
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
Chart_plot(col_name,fc_series)
col_name = 'Net Profit'
tr_cnt = 18
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
p_values = [0, 1, 2]
d_values = range(0,2)
q_values = range(0, 2)
warnings.filterwarnings("ignore")
best_order = evaluate_models(df_PL[col_name], p_values, d_values, q_values,tr_cnt,4)
train = df_PL[col_name][:tr_cnt]
test = df_PL[col_name][tr_cnt:]
# define model
model = ARIMA(train, order=best_order)
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
Chart_plot(col_name,fc_series)
#Ad-fuller_test
#define function for ADF test
from statsmodels.tsa.stattools import adfuller
def adf_test(timeseries):
#Perform Dickey-Fuller test:
print ('Results of Dickey-Fuller Test:')
dftest = adfuller(timeseries)
dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
for key,value in dftest[4].items():
dfoutput['Critical Value (%s)'%key] = value
print (dfoutput)
adf_test(df_PL['Sundry Other Income'])
adf_test(df_PL['Profit on Sale_or_Rev of Investments'])
#Sundry Other Income
col_name = 'Other Provisions'
tr_cnt = 18
train = df_PL[col_name][13:tr_cnt]
print(train)
test = df_PL[col_name][tr_cnt:]
print(test)
# define model
model = ARIMA(train, order=(0,0,1))
model_fit = model.fit()
result = model_fit.get_forecast(steps=4)
output = result.summary_frame(alpha = 0.05)
fc_series = pd.Series(output['mean'])
plt.figure(figsize=(12,8), dpi=200)
plt.plot(train, label='training',marker = 'o', linestyle= '--')
plt.plot(test, label='actual',marker = 'o', linestyle= '--', color = 'cornflowerblue')
plt.plot(fc_series, label='forecast',marker = 'o', linestyle= ':' , color = 'orange')
mon = ['Jun', "Sep", 'Dec', 'Mar']
yrs = list(np.arange(17,23,1))
x_tks = ['FY' + str(j) +'_'+i.strip() for j in yrs for i in mon]
x = np.arange(0, len(train) + len(fc_series), 1)
plt.xticks(x, x_tks, rotation=75)
plt.legend(loc='upper left', fontsize=8)
plt.grid(True)
'''
for x,y in zip(x,df_PL[col_name]):
label = "{:.2f}".format(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
color = 'b',
ha='center') # horizontal alignment can be left, right or center
tst_x = np.arange(18,23, 1)
for x,y in zip(tst_x,fc_series):
label = "{:.2f}".format(y)
plt.annotate(label, # this is the text
(x,y), # these are the coordinates to position the label
textcoords="offset points", # how to position the text
xytext=(0,10), # distance from text to points (x,y)
color = 'darkorange',
ha='right') # horizontal alignment can be left, right or center
'''
print(fc_series)
mape = "{:.3f}".format(MAPE(test, fc_series))
#print('MAPE :: %s' %mape, '%')
plt.title(col_name +'- Forecating'+'----MAPE--'+str(mape)+'%')